package blog

import (
	"encoding/json"
	"fmt"
	"time"

	"gitee.com/shiwjlinux/vblog01/common"
)

func NewBlogSet() *BlogSet {
	return &BlogSet{
		Items: []*Blog{},
	}
}

type BlogSet struct {
	Total int64   `json:"total"`
	Items []*Blog `json:"items"`
}

func (req *BlogSet) String() string {
	b, _ := json.MarshalIndent(req, "", " ")
	return string(b)
}

// 创建一个新的Blog实例
func NewBlog() *Blog {
	// 返回一个指向Blog实例的指针
	return &Blog{
		// 调用common包中的NewMeta()函数，创建一个新的Meta实例
		common.NewMeta(),
		// 调用NewCreateBlogRequest()函数，创建一个新的CreateBlogRequest实例
		NewCreateBlogRequest(),
		// 调用NewChangedBlogStatusRequest()函数，创建一个新的ChangedBlogStatusRequest实例，并将其状态设置为STATUS_DRAFT
		NewChangedBlogStatusRequest().SetStatus(STATUS_DRAFT),
	}
}

type Blog struct {
	*common.Meta
	*CreateBlogRequest
	*ChangedBlogStatusRequest
}

// 将Blog结构体转换为JSON格式的字符串
func (req *Blog) String() string {
	// 将req结构体转换为JSON格式的字节切片
	b, _ := json.MarshalIndent(req, "", " ")
	// 将字节切片转换为字符串并返回
	return string(b)
}

func NewCreateBlogRequest() *CreateBlogRequest {
	return &CreateBlogRequest{
		Tags: map[string]string{},
	}
}

type CreateBlogRequest struct {
	Title    string            `json:"title" validate:"required"`
	Author   string            `json:"author" validate:"required"`
	Content  string            `json:"content" validate:"required"`
	Summary  string            `json:"summary"`
	CreateBy string            `json:"create_by"`
	Tags     map[string]string `json:"tags" gorm:"column:tags;serializer:json"`
}

func NewChangedBlogStatusRequest() *ChangedBlogStatusRequest {
	return &ChangedBlogStatusRequest{}
}

type ChangedBlogStatusRequest struct {
	PublishedAt int64   `json:"published_at"`
	Status      *STATUS `json:"status"`
}

// SetStatus 方法用于设置 ChangedBlogStatusRequest 结构体的 Status 字段，并返回该结构体指针
func (req *ChangedBlogStatusRequest) SetStatus(s STATUS) *ChangedBlogStatusRequest {
	// 将传入的参数 s 赋值给 req.Status
	req.Status = &s
	// 根据 req.Status 的值进行不同的操作
	switch *req.Status {
	case STATUS_PUBLISH:
		// 如果 req.Status 的值为 STATUS_PUBLISH，则将当前时间戳赋值给 req.PublishedAt
		req.PublishedAt = time.Now().Unix()
	}
	// 返回 req 结构体指针
	return req
}

func (req *CreateBlogRequest) Validate() error {
	if req.Title == "" {
		return fmt.Errorf("标题不能为空")
	}
	if req.Author == "" {
		return fmt.Errorf("作者不能为空")
	}
	if req.Content == "" {
		return fmt.Errorf("内容不能为空")
	}
	return nil

	// return common.Validate(req)
}

func (req *CreateBlogRequest) String() string {
	b, _ := json.MarshalIndent(req, "", " ")
	return string(b)
}

func (req *CreateBlogRequest) TableName() string {
	return AppName + "s"
}
